package case11

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"log"
	"os"
	"time"
)

func Test() {
	fmt.Println("🎯示例十一：一对一关系")

	db, err := mysqlConnect()
	if err != nil {
		fmt.Println(err)
		return
	}

	if err := db.AutoMigrate(&UserCase11{}, &IdCardCase11{}); err != nil {
		fmt.Println("创建失败：", err)
	}

	fmt.Println("创建成功...")

	// 批量插入用户表
	//ucArr1 := []UserCase11{
	//	{Name: "丽丽"},
	//	{Name: "王强"},
	//}
	//db.Create(&ucArr1)

	// 批量插入身份证号表
	//idArr1 := []IdCardCase11{
	//	{Card: "411060012302136530", UserID: 1},
	//	{Card: "411060012302136531", UserID: 2},
	//}
	//db.Create(&idArr1)

	// 查询所有用户表信息
	ucArr2 := []UserCase11{}
	//db.Find(&ucArr2)

	// 查询所有身份证号表信息
	idArr2 := []IdCardCase11{}
	//db.Find(&idArr2)

	// 预加载查询
	//db.Preload(_IdCardCase11).Find(&ucArr2)

	// joins关联查询 用户各自的身份证号和用户姓名
	//db.Joins(_IdCardCase11).Find(&ucArr2)

	// join 自定义条件查询 只能查询用户表数据，身份表数据填充不回来
	//db.Joins("Left Join id_card_case11 on id_card_case11.user_id = user_case11.id" +
	//	"").Find(&ucArr2)
	//db.Model(
	//	&UserCase11{}).Joins("Left Join id_card_case11 on id_card_case11.user_id = user_case11.id" +
	//	"").Find(&ucArr2)

	// 使用 Raw SQL 查询 与 Scan 自定义映射
	var ucm1 []map[string]interface{}
	db.Raw(`
		 SELECT 
				u.id as user_id,
				u.name as user_name,
				i.card
			FROM user_case11 u
			LEFT JOIN id_card_case11 i ON u.id = i.user_id
		`).Scan(&ucm1)
	fmt.Println(ucm1)
	fmt.Println(ucArr2)
	fmt.Println(idArr2)
	fmt.Println(db)
}

// 初始化连接
func mysqlConnect() (*gorm.DB, error) {
	url := "root:123456@tcp(127.0.0.1:3306)/case1?charset=utf8mb4&parseTime=True&loc=Local"

	// 配置自定义 Logger 打印sql日志
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
		logger.Config{
			SlowThreshold:             time.Second, // 慢 SQL 阈值
			LogLevel:                  logger.Info, // 可以设置为不同级别 Silent-不打印任何日志 Error-只打印错误日志 Warn-打印慢查询和错误 Info-打印慢查询和错误
			IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound（记录未找到）错误
			Colorful:                  true,        // 彩色打印
		},
	)

	db, err := gorm.Open(mysql.Open(url), &gorm.Config{
		Logger: newLogger, // 设置 Logger
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 关闭默认，使用表名
		},
	})
	if err != nil {
		return nil, fmt.Errorf("mysql connect err: %v", err)
	}

	return db, nil
}

// 一对一关系
// 用户结构体
type UserCase11 struct {
	ID     int          `gorm:"primarykey;autoIncrement"`
	Name   string       `gorm:"size:20;unique;"`
	IdCard IdCardCase11 `gorm:"foreignKey:UserID"` // 一个用户对应一个身份证号
}

// 身份证号结构体
type IdCardCase11 struct {
	ID     int    `gorm:"primarykey;autoIncrement"`
	Card   string `gorm:"type:varchar(20);unique"`
	UserID int    `gorm:"uniqueIndex;"` // 外键且唯一
}

// 定义包级常量
const (
	_IdCardCase11 = "IdCard" // 这里用用户表字段名
)
